<?php
/***************************************************************
 *  Copyright notice
*
*  (c) 2011 Florian Müller <it-admin@ifp-potsdam.co>, IFP
*
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 3 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

/**
 * Controller for the Anmeldung object
 */
class Tx_IfpCurriculum2_Controller_AnmeldungController extends Tx_Extbase_MVC_Controller_ActionController {

	/**
	 * @var Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository
	 */
	protected $anmeldungRepository;
	/**
	 * @var Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository
	 */
	protected $teilnehmerRepository;
	/**
	 * @var Tx_IfpCurriculum2_Domain_Repository_KursstammRepository
	 */
	protected $kursstammRepository;

	/**
	 * @param Tx_IfpCurriculum2_Domain_Repository_KursstammRepository $kursstammRepository
	 * @return void
	 -	 */
	public function injectKursstammRepository(Tx_IfpCurriculum2_Domain_Repository_KursstammRepository $kursstammRepository) {
		$this->kursstammRepository = $kursstammRepository;
	}

	/**
	 * @param Tx_IfpCurriculum2_Domain_Repository_KursRepository $kursRepository
	 * @return void
	 -	 */
	public function injectKursRepository(Tx_IfpCurriculum2_Domain_Repository_KursRepository $kursRepository) {
		$this->kursRepository = $kursRepository;
	}
	/**
	 * @param Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository $anmeldungRepository
	 * @return void
	 -	 */
	public function injectAnmeldungRepository(Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository $anmeldungRepository) {
		$this->anmeldungRepository = $anmeldungRepository;
	}
	/**
	 * @param Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository $teilnehmerRepository
	 * @return void
	 -	 */
	public function injectTeilnehmerRepository(Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository $teilnehmerRepository) {
		$this->teilnehmerRepository = $teilnehmerRepository;
	}



	/**
	 * Displays all Anmeldungs
	 *
	 * @return void
	 */
	public function listAction() {
		$anmeldungs = $this->anmeldungRepository->findMy();
		$teilnehmer= $this->teilnehmerRepository->getTeilnehmer();
		//$teilnehmer->getAusbildungsschema()
		//var_dump($teilnehmer->getAusbildungsschema()->getUid());
		//var_dump($teilnehmer->getAusbildungsschema()->getName());
		if($teilnehmer->getAusbildungsschema()!=null){
			$kurseZuBesuchen=$this->kursstammRepository->findByAusbildungsschemas($teilnehmer->getAusbildungsschema());

			$anmeldung2Ausbidlungen=array();
			$toDisplay2=array();
			foreach ($kurseZuBesuchen as $kursstamm) {
				$anmeldungfound=$this->checkIfAlreadyBooked($kursstamm, $anmeldungs);
				$temp=array();
				$temp['kursNr']=$kursstamm->getKursNr();
				$temp['gkvatext']=$kursstamm->getGkvatext();
				if($anmeldungfound){
					$anmeldung2Ausbidlungen[]=$anmeldungfound;
					$temp['datum']=$anmeldungfound->getVeranstaltung()->getErstbeginn();
					$temp['uestatus']=$anmeldungfound->getUeStatus();
					$temp['status']=$anmeldungfound->getStatus();
					$temp['statusCode']=$anmeldungfound->getStatus();
					$temp['titel']=$anmeldungfound->getVeranstaltung()->getTitel();
					$temp['kursNr']=$anmeldungfound->getVeranstaltung()->getKurs()->getKursNr();
					$temp['anmeldeId']=$anmeldungfound;
					$temp['veranstaltungsID']=$anmeldungfound->getVeranstaltung();
				}else{
					$temp['uestatus']=$kursstamm->getUe();
					$temp['status']='offen';
					$temp['statusCode']=-1;
					$temp['titel']=$kursstamm->getTitel();
					foreach ($kursstamm->getKurse() as $kurs) {
						if(!$kurs->isInaktiv()){
							$kursinfo=array();
							$kursinfo['kurstitel']=$kurs->getTitel();
							$kursinfo['version']=$kurs->getVersion();
							$kursinfo['kursID']=$kurs;
							$temp['kurs'][]=$kursinfo;
						}
					}
						
					//	if($kursstamm)
				}
				$toDisplay2[]=$temp;
			}
		}
		$nichtgelisteteAnmeldungen=array();
		foreach ($anmeldungs as $anmeldung) {
			$found=false;
			foreach ($anmeldung2Ausbidlungen as $anmeldung2Ausbidlung) {
				if($anmeldung==$anmeldung2Ausbidlung){
					$found=true;

				}
			}
			if($found==false)
			$nichtgelisteteAnmeldungen[]=$anmeldung;
		}
		//var_dump($toDisplay2);
		$this->view->assign('teilnehmer', $teilnehmer);
		$this->view->assign('anmeldungen', $nichtgelisteteAnmeldungen);
		$this->view->assign('kurse', $toDisplay2);
	}

	private function checkIfAlreadyBooked(Tx_IfpCurriculum2_Domain_Model_Kursstamm $tocheck,$anmeldungen) {
		//echo "suche: ".$tocheck->getKursNr()."?";
		foreach ($anmeldungen as $anmeldung) {
			//echo $anmeldung->getVeranstaltung()->getKurs()->getKursstamm()->getKursNr()."|";
			if($tocheck->getKursNr()==$anmeldung->getVeranstaltung()->getKurs()->getKursstamm()->getKursNr())
			if($anmeldung->getStatusCode()>=0)
			return $anmeldung;
		}
		return false;
	}


	/**
	 * Displays a single Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string The rendered view
	 */
	public function showAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {

		$this->view->assign('anmeldung', $anmeldung);
	}



	/**
	 * Displays a form for creating a new  Anmeldung
	 * @param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer
	 * @return void
	 * @dontvalidate $newAnmeldung
	 */
	public function newAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung = NULL,Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer= NULL) {
		$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
		
		if (!isset($GLOBALS['TSFE']->fe_user->user['uid'])&&!isset($teilnehmer)) {
			$this->redirect("new", "Teilnehmer",null, array("veranstaltung"=> $veranstaltung));
		}else{
			if($teilnehmer==null){
				$teilnehmer=$teilnehmerRepository->getTeilnehmer();
				$this->checkTeilnehmerData($teilnehmer);
			}
		}
		if($teilnehmer->getAusbildungsschema()!=null&&!$veranstaltung->gehoertzu($teilnehmer->getAusbildungsschema())){
			$this->flashMessageContainer->add('Diese Veranstaltung gehört nicht zu Ihrem Ausbildungsgang. Bitte wenden Sie sich an unser Sekretariat.');
			$this->redirect('list',"Veranstaltung");
		}
		if($veranstaltung->isfull()){
			$this->flashMessageContainer->add('Die Veranstaltung ist leider ausgebucht. Bitte wenden Sie sich wegen evtl. Nachrückplätze an unser Sekretariat.');
			$this->redirect('list',"Veranstaltung");

		}
		if(!$veranstaltung->isAnmeldungMoeglich()){
			$this->flashMessageContainer->add('Die Anmeldefrist ist abgelaufen. Bitte wenden Sie sich an unser Sekretariat.');
			$this->redirect('list',"Veranstaltung");

		}
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$teilnehmer)){
			$this->flashMessageContainer->add('Sie sind bereits für diese Veranstaltung angemeldet.');
			$this->redirect('list',"Veranstaltung");

		}


		$this->view->assign('newAnmeldung', $newAnmeldung);
		$this->view->assign('teilnehmer', $teilnehmer);
		$this->view->assign('veranstaltung', $veranstaltung);
	}
	/**
	 * Displays a form for creating a new  Anmeldung
	 * @param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 * @dontvalidate $newAnmeldung
	 */
	public function adminnewAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung = NULL) {
		$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
		

		$teilnehmers=$teilnehmerRepository->findAll();
		$teilnehmerarray=array();
		$teilnehmerarray[]="";
		foreach ($teilnehmers as $teilnehmer) {
			$teilnehmerarray[]=$teilnehmer;
		}


		$this->view->assign('newAnmeldung', $newAnmeldung);
		$this->view->assign('teilnehmer', $teilnehmerarray);
		$this->view->assign('veranstaltung', $veranstaltung);
	}

	/**
	 * Creates a new Anmeldung and forwards to the list action.
	 *@param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 */
	public function createAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung,Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer) {

		if (!isset($GLOBALS['TSFE']->fe_user->user['uid'])&&!isset($teilnehmer)) {
			$this->redirect("new", "Teilnehmer",null, array("veranstaltung"=> $veranstaltung));
		}else{
			if($teilnehmer==null){
				$teilnehmer=$teilnehmerRepository->getTeilnehmer();
			}
		}
		if(!$veranstaltung->isAnmeldungMoeglich()){
			$this->flashMessageContainer->add('Eine Anmeldung für diese Veranstaltung ist nicht mehr möglich. Bei Problemen bitte nehmen Sie Kontakt zu unserem Büro auf.');
			$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );

		}
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$teilnehmer)){
			$this->flashMessageContainer->add('Sie sind bereits angemeldet.');
			$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );

		}
		$newAnmeldung->setVeranstaltung($veranstaltung);
		$newAnmeldung->setDefault();
		$newAnmeldung->setTeilnehmer($teilnehmer);
		$this->bestaetigungsMail($newAnmeldung);
		$this->anmeldungRepository->add($newAnmeldung);
		$this->flashMessageContainer->add('Vielen Dank für Ihre Anmeldung. Sie erhalten in den nächsten Minuten eine Bestätigung per Mail.');

		$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );


	}

	/**
	 * Creates a new Anmeldung and forwards to the list action.
	 *@param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 */
	public function admincreateAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung) {
		$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
		if($this->request->hasArgument("teilnehmer")){
			if($this->request->getArgument("teilnehmer")!=0){
				$teilnehmer=$teilnehmerRepository->findbyUid($this->request->getArgument("teilnehmer"));
				$newAnmeldung->setTeilnehmer($teilnehmer);
			}
		}
		$newAnmeldung->setVeranstaltung($veranstaltung);
		$newAnmeldung->setDefault();
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$newAnmeldung->getTeilnehmer())){
			$this->flashMessageContainer->add('Der Teilnehmer wurde bereits angemeldet.');
		}else{
			$this->bestaetigungsMail($newAnmeldung);
			$this->anmeldungRepository->add($newAnmeldung);
		}
		$this->redirect('adminshow',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );
	}



	/**
	 * Displays a form for editing an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string A form to edit a Anmeldung
	 */
	public function editAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->checkUser($anmeldung->getTeilnehmer());

		$this->view->assign('anmeldung', $anmeldung);
	}
	/**
	 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer
	 */
	protected function checkUser(Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer){

		$myTeilnehmer=$this->teilnehmerRepository->getTeilnehmer();
		if($myTeilnehmer->getUid()!=$teilnehmer->getUid()){
			$this->redirect("list");
		}
	}


	/**
	 * Displays a form for editing an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string A form to edit a Anmeldung
	 */
	public function admineditAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->view->assign('anmeldung', $anmeldung);
	}

	/**
	 * Updates an existing Anmeldung and forwards to the list action afterwards.
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 */
	public function updateAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->checkUser($anmeldung->getTeilnehmer());
		if($this->request->hasArgument("storno")){
			if($this->request->getArgument("storno")=="storno"){
				$anmeldung->setStornierungszeitpunkt(new DateTime());
			}
		}
		$this->anmeldungRepository->update($anmeldung);
		$this->flashMessageContainer->add('Your Anmeldung was updated.');
		$this->redirect('list');
	}


	/**
	 * Deletes an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to be deleted
	 * @return void
	 */
	public function deleteAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->anmeldungRepository->remove($anmeldung);
		$this->flashMessageContainer->add('Your Anmeldung was removed.');
		$this->redirect('list');
	}
	/**
	 * Updates an existing Anmeldung and forwards to the list action afterwards.
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 */
	public function adminupdateAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {

		if($this->request->hasArgument("storno")){
			if($this->request->getArgument("storno")=="storno"){
				$anmeldung->setStornierungszeitpunkt(new DateTime());
			}
		}
		$this->anmeldungRepository->update($anmeldung);
		$this->flashMessageContainer->add('Die Anmeldung wurde aktuallisiert.');
		$this->redirect('adminshow',"Veranstaltung",null,array("veranstaltung"=>$anmeldung->getVeranstaltung()));
	}
	/**
	 *
	 * Enter description here ...
	 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer
	 */
	protected function checkTeilnehmerData(Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer){

		if($teilnehmer->getGeschlecht()===NULL){
			$this->redirect('edit',"Teilnehmer");
		}
	}
	/**
	 *
	 * Enter description here ...
	 * @param  $data
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung
	 */
	protected function bestaetigungsMail(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		// create a Fluid instance for plain text rendering
		$renderer = $this->getPlainTextEmailRenderer('Buchungsbestaetigung');
		// assign the data to it
		$renderer->assign('anmeldung', $anmeldung);
		// and do the rendering magic
		$message = $renderer->render();
		echo $message;
		// finally, send the mail

		$this->sendMail($anmeldung->getTeilnehmer()->getMail(), 'Buchungsbestätigung für den Kurs '.$anmeldung->getVeranstaltung()->getTitel(), $message, 'info@ifp-potsdam.com', 'IfP-Potsdam Veranstaltungsbuchungsssytem');
	}

	protected function sendMail($recipient, $subject, $message, $senderEMail, $senderName='', $replyToEMail='', $replyToName='', $returnPath='', $organization='') {
		$htmlMail = t3lib_div::makeInstance('t3lib_htmlmail');
		$htmlMail->start();
		$htmlMail->recipient = $recipient;
		$htmlMail->subject = $subject;
		$htmlMail->from_email = $senderEMail;
		$htmlMail->from_name = $senderName;
		$htmlMail->replyto_email = $replyToEMail != '' ? $replyToEMail : $senderEMail;
		$htmlMail->replyto_name = $replyToName != '' ? $replyToName : $senderName;
		$htmlMail->organisation = $organisation;
		$htmlMail->returnPath = $returnPath;
		$htmlMail->addPlain($message);
		$htmlMail->send($recipient);
	}

	/**
	 * This creates another stand-alone instance of the Fluid view to render a plain text e-mail template
	 * @param string $templateName the name of the template to use
	 * @return Tx_Fluid_View_StandaloneView the Fluid instance
	 */
	protected function getPlainTextEmailRenderer($templateName = 'default') {
		$emailView = $this->objectManager->create('Tx_Fluid_View_StandaloneView');
		$emailView->setFormat('txt');
		$extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
		$templateRootPath = t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['templateRootPath']);
		$templatePathAndFilename = $templateRootPath . $this->request->getControllerName().'/' . $templateName . '.txt';
		$emailView->setTemplatePathAndFilename($templatePathAndFilename);
		$emailView->assign('settings', $this->settings);
		return $emailView;
	}

}
?>